/**
 * @Copyright:Copyright (c) 1991 - 2016
 * @Company: Macroview
 */
package com.tengtong.duang.commons.collections;

import java.util.ConcurrentModificationException;
import java.util.Map;
import java.util.function.BiConsumer;
import java.util.function.BiFunction;
import java.util.function.Consumer;

/**
 * Map 的方便快捷工具
 *
 * @author Jai
 * @since: v1.0
 */
public class MapWrapper<K, V> {

	private Map<K, V> map;
	
	public MapWrapper(Map<K, V> map){
		this.map = map;
	}
	
	/**
	 * 静态创建方法
	 * @param arrays
	 * @return
	 */
	public static <K, V> MapWrapper<K, V> wrapper(Map<K, V> c){
		return new MapWrapper<K, V>(c);
	}
	
	/**
	 * 提供中止的逐个迭代。
	 * 
	 * 如果 action 返回 false，则会中止迭代，返回 true 表示迭代继续
	 *
	 * @param action
	 */
	public void forEachHaveBreak(BiFunction<? super K, ? super V, Boolean> action){
		if(notNullOrEmpty()){
			for(Map.Entry<K, V> entry : map.entrySet()){
	            K k;
	            V v;
	            try {
	                k = entry.getKey();
	                v = entry.getValue();
	            } catch(IllegalStateException ise) {
	                // this usually means the entry is no longer in the map.
	                throw new ConcurrentModificationException(ise);
	            }
	            if(!action.apply(k, v)){
	            	break;
	            }
			}
		}
	}
	
	/**
	 * 仅对 Key 进行迭代
	 *
	 * @param action
	 */
	public void forEachForKeys(Consumer<? super K> action){
		if(notNullOrEmpty()){
			map.keySet().forEach(action);
		}
	}
	
	/**
	 * 仅对 value 进行迭代
	 *
	 * @param action
	 */
	public void forEachForValues(Consumer<? super V> action){
		if(notNullOrEmpty()){
			map.values().forEach(action);
		}
	}

	/**
	 * 逐个迭代
	 * 
	 * @param action
	 */
	public void forEach(BiConsumer<? super K, ? super V> action){
		if(notNullOrEmpty()){
			map.forEach(action);
		}
	}

	/**
	 * map 不为 null 或空
	 *
	 * @return
	 */
	public boolean notNullOrEmpty() {
		return map != null && map.size() > 0;
	}
	
}
